Willkommen zur nächsten Einheit der relationalen Algebra. Diesmal geht es um Joins – also um das gezielte Verknüpfen von Tabellen. Den Anfang macht die Schnittmenge – in der relationalen Algebra auch Durchschnitt genannt und dargestellt durch das Symbol: „Tabelle eins Durchschnitt Tabelle zwei“. Die Schnittmenge R Durchschnitt S besteht aus genau den Tupeln, die sowohl in Relation R als auch in Relation S enthalten sind. Man nennt das auch den gemeinsamen Teil zweier Tabellen – ähnlich wie bei Mengen in der Mathematik. Schauen wir uns nun an, wie die Schnittmenge als Relationenalgebra aussieht. R und S sind zwei Tabellen mit den gleichen Spalten A, B und C. In Tabelle R sehen wir zum Beispiel die Tupel eins, zwei, drei und vier, fünf, sechs. Tabelle S enthält sieben, acht, neun sowie vier, fünf, sechs. Die Schnittmenge R Durchschnitt S ergibt also nur das Tupel vier, fünf, sechs – weil es in beiden Tabellen identisch vorkommt. Genau das ist das Ergebnis der Operation „R Durchschnitt S“. In SQL formulieren wir die Schnittmenge mit einem Inner Join. Angenommen, wir haben „Tabelle eins“ mit Alias „t eins“ und „Tabelle zwei“ mit Alias „t zwei“. Dann schreiben wir: Select Sternchen from Tabelle t eins Inner Join Tabelle t zwei on t eins Punkt ID gleich t zwei Punkt Fremdschlüssel. Wichtig ist, dass die Tupel über ihre Primärschlüssel eindeutig identifizierbar sind. Nun kommen wir zum Natural Join – dargestellt durch das „natürlicher Verbund“-Symbol. Was genau ist der Unterschied zwischen einem Natural Join und einem Inner Join? Beim Natural Join werden zwei Tabellen automatisch über alle gleichlautenden Spalten verbunden. Diese Spalten erscheinen im Ergebnis nur einmal. Gibt es keine gleichlautenden Spalten, wird daraus ein Cross Join – also ein vollständiges Kreuzprodukt. Wenn es nur genau eine gleichlautende Spalte gibt, entspricht das einem Inner Join mit anschließender Projektion, bei dem doppelte Spalten entfernt werden. Einen speziellen SQL-Befehl für den Natural Join gibt es nicht – man setzt ihn in SQL manuell um, durch Kombination aus Inner Join und Projektion. In der relationalen Algebra sieht ein Natural Join zwischen zwei Relationen R und S so aus: Beide Tabellen haben gemeinsame Spalten – zum Beispiel Attribut A. Tabelle R enthält A, B, C, D – Tabelle S enthält A, F, G. Der Join erfolgt über Spalte A. Das Ergebnis ist eine kombinierte Tabelle, die die gemeinsamen Tupel miteinander verbindet. Zum Beispiel: Eins, zwei, drei, vier aus R wird mit Eins, zwei, drei aus S verbunden. Das ergibt: Eins, zwei, drei, vier, zwei, drei – alles in einer Zeile. Auch in MariaDB lässt sich ein Natural Join durchführen, wenn beide Tabellen eine gemeinsame Spalte wie ID haben. Dazu nutzt man einfach: Select Sternchen from Tabelle A Natural Join Tabelle B. Dabei werden automatisch die Spalten verbunden, die in beiden Tabellen denselben Namen haben. Nur die Zeilen mit übereinstimmenden Werten in diesen Spalten erscheinen im Ergebnis. Das ist besonders praktisch, wenn man keine manuelle Join-Bedingung angeben möchte. Als nächstes der Full Outer Join. Das bedeutet: Alle Tupel aus beiden Tabellen sollen erscheinen – egal ob sie zueinander passen oder nicht. Ein Full Outer Join scheint auf den ersten Blick ähnlich wie eine Union – aber es gibt einen großen Unterschied. Bei einer Union werden die Ergebnisse einfach zusammengefügt, ohne auf inhaltliche Verknüpfung zu achten. Ein Full Outer Join hingegen verbindet jede Zeile mit passenden Einträgen – oder setzt NULL, wenn nichts passt. In MariaDB geht das so nicht direkt – aber man kann es simulieren. In der relationalen Algebra schreibt man: r eins Outer Join r zwei. Schauen wir auf ein Beispiel: Tabelle r eins enthält die Spalten A, B und C mit den Tupeln a eins, b eins, c eins und a zwei, b zwei, c zwei. Tabelle r zwei enthält die Spalten C, D und E. Im Ergebnis sehen wir: passende Kombinationen werden zusammengefügt – etwa c eins in beiden Tabellen. Fehlende Daten auf einer Seite werden durch NULL ergänzt. Da MariaDB keinen Full Outer Join direkt unterstützt, müssen wir tricksen. Wir kombinieren einen Left Join mit einem Right Join und fügen beide Ergebnisse mit Union zusammen. Dadurch erhalten wir alle Tupel – auch die, die nur auf einer Seite vorkommen. Ein Beispiel: Wir haben zwei Tabellen – Hersteller und Produkt. Hersteller enthält Zulieferer wie Hilti, Hoch und Tief, und so weiter. Produkt enthält Werkzeuge wie Zement, Kneifzange oder Hammer – jeweils mit einem Verweis auf den Hersteller über die Spalte h-s-link. Der SQL-Befehl für den Full Outer Join sieht so aus: Zuerst: Select Zulieferer, Produkt from Hersteller Left Join Produkt on ID gleich h-s-link. Dann: Select Zulieferer, Produkt from Hersteller Right Join Produkt on ID gleich h-s-link. Beide Ergebnisse werden mit Union zusammengefügt. In relationaler Algebra schreiben wir: Projektion auf Zulieferer und Produkt von Hersteller Outer Join Produkt mit Join-Bedingung. Das Ergebnis ist eine vollständige Übersicht aller Zulieferer und Produkte. Wir sehen: Hilti liefert den Schlagbohrer und Eisen-Karl liefert gleich mehrere Produkte. Hersteller wie Stahl AG sowie Gähn und Söhne tauchen ebenfalls auf – auch wenn sie derzeit nichts liefern. Und umgekehrt sehen wir, dass der Hammer keinem registrierten Zulieferer zugeordnet ist – daher erscheint in der Spalte Zulieferer ein NULL-Wert. Nun zum Left Outer Join. Hier behalten wir alle Tupel aus der linken Tabelle – auch wenn es keine passenden Partner in der rechten Tabelle gibt. Schauen wir uns den Left Outer Join genauer an – zunächst in der relationalen Algebra. Wir haben zwei Tabellen: r eins mit den Spalten A, B und C sowie r zwei mit C, D und E. In beiden Tabellen gibt es Überschneidungen – zum Beispiel den Wert c eins in Spalte C. Beim Left Outer Join bleiben alle Zeilen aus der linken Tabelle r eins erhalten. Wenn es in r zwei einen passenden Eintrag gibt, wird dieser ergänzt. Wenn nicht, entstehen in den zusätzlichen Spalten NULL-Werte. Im Beispiel sehen wir: Das Tupel A eins, B eins, C eins findet in r zwei eine passende Zeile – die Werte d eins und e eins werden ergänzt. Das zweite Tupel A zwei, B zwei, C zwei hingegen findet keine passende Übereinstimmung in r zwei – und so entstehen in D und E zwei NULL-Werte. In MariaDB können wir einen Left Outer Join mit folgendem Befehl umsetzen: Select Sternchen from Tabelle eins t eins Left Join Tabelle zwei t zwei on t eins Punkt ID gleich t zwei Punkt Fremdschlüssel. Das bedeutet: Alle Zeilen aus Tabelle eins erscheinen im Ergebnis – auch wenn es keine passenden Einträge in Tabelle zwei gibt. In der relationalen Algebra wird das mit einem Join-Symbol mit Pfeil nach rechts dargestellt – r eins Left Outer Join r zwei. Schließlich betrachten wir den Right Outer Join – also die umgekehrte Variante. Das Symbol ist ein Kreis mit Öffnung nach rechts. Wenn man die Tabellen eins und zwei vertauscht, kann man natürlich dasselbe Ergebnis erzielen wie beim Left Outer Join. Die beiden Operationen sind einfach nur spiegelverkehrt. Beim Right Outer Join funktioniert alles genau umgekehrt. Wir betrachten wieder zwei Tabellen: r eins mit A, B und C sowie r zwei mit C, D und E. Hier ist r zwei die rechte Tabelle – und alle ihre Zeilen sollen erhalten bleiben. Im Ergebnis sehen wir: Das Tupel mit c eins wird erfolgreich mit einem passenden Tupel aus r eins verbunden – die Daten aus beiden Tabellen werden zusammengeführt. Das Tupel mit c drei in r zwei findet jedoch keinen Partner in r eins – also erscheinen in den Spalten A und B NULL-Werte. In relationaler Algebra: r eins Right Outer Join r zwei. Auch in MariaDB lässt sich ein Right Outer Join ausführen: Select Sternchen from Tabelle eins t eins Right Join Tabelle zwei t zwei on t eins Punkt ID gleich t zwei Punkt Fremdschlüssel. Dieser Befehl stellt sicher, dass alle Zeilen aus Tabelle zwei im Ergebnis auftauchen. Fehlende Daten aus Tabelle eins werden dabei mit NULL-Werten aufgefüllt. Auch hier hilft die Visualisierung mit einem Kreisdiagramm: Die rechte Tabelle ist vollständig eingefärbt – sie dominiert das Ergebnis.